<?php
/**
* @name get_all_picker
* 获取数据库中全部的采集器
*/
// error_reporting(E_ALL);
// @ini_set('log_errors', 'On');
// @ini_set('display_errors', 'On');

function get_all_picker(){
	global $wpdb;
	$pickers = $wpdb->get_results('SELECT name,id FROM wp_picker', 'ARRAY_A');

	return $pickers;
}

$all_pickers = get_all_picker();
?>

<!--前台页面内容////////////////////////////////////////////-->
<style>
	.p_main{margin:20px; }
	label{width: 300px; float: left;}
	br{clear: left;}
	.submit{width:100px; height: 35px; margin-top: 20px; background-color: #111; color:#fff;}
</style>
<div class="p_main">
	<h4>请选择采集器</h4>
	<form method="POST" action="">
		<input type="hidden" name="hidden">
		<?php foreach ($all_pickers as $pker):?>
			<label><?php echo $pker['name'];?></label><input type="radio" name="picker" value="picker_<?php echo $pker[id]?>"><br>
		<?php endforeach; ?>
		<br><label>采集页数</label><input type="text" name="times"><br>
		<input class="submit" type="submit" name="submit">
	</form><hr>
</div>


<?php
/////////////////PICKER AGAIN////////////////////////
#0、包含采集类
require_once( phy_path() . '/lib/wp-picker.php' );
$picker = new picker();


#1、检测是否重复提交页面
if( isset( $_POST['hidden'] ) ){

	#检测表单内容是否有效
	if( false == $picker->checkFormValid( $_POST ) ){
		echo "请重新选择<br>";
		die();
	}

	#获取当前采集器的规则
	$thePkerRule = $picker->getPickerRule( $_POST['picker'] ); 

	#首先打印一下采集规则，看看是否有错
	echo "当前采集规则如下：";
	var_dump( $thePkerRule );

	#判断列表页是否有分页
	if( 0 == substr_count( $thePkerRule['list'] , '[*]' ) ){
		#没有分页，则只采集当前页面
		@$theContent = do_pick_since_list( $picker , $thePkerRule , '' , $picker->getPickerId( $_POST['picker'] ) );

	}else{
		#存在分页，循环处理每一个列表页面
		for( $lNum = 0; $lNum < $_POST['times'] ; $lNum++ ){
			#跳转到实际采集函数中
			@$theContent[] = do_pick_since_list( $picker , $thePkerRule , str_replace( '[*]' , $lNum, $thePkerRule['list'] ) , $picker->getPickerId( $_POST['picker'] ) );	
		}
		
	}

}else{
	#页面刷新、重复点击提交检测
	echo "重复提交页面<br>";
}

/**
* @name   do_pick_since_list  从列表页开始执行采集工作
* @param  obj    picker  已声明的采集器对象
* @param  array  pkRule  当前采集器所包含的全部规则
* @param  string curLst  当前要处理的列表页，在无分页情况下可忽略
* @param  int    pkId    当前采集器的编号
* @return array  theCtt  采集到的最终内容
* @todo   添加采集结果的优化函数
*/
function do_pick_since_list( $picker , $pkRule = array() , $curLst = '' , $pkId = 0 ){
	#判断是否有分页
	if( 0 == strlen( $curLst ) ){
		$curLst = $pkRule['list'];
	}

	#引入common_simdegree文件，调用其中的关键词计算功能
	require_once( phy_path() . "/lib/common_simdegree.php" );
	$sd = new simDegree();

	#通过列表页链接抓取列表页内容
	$theLstPgCtt = $picker->getPageCttByCurl( $curLst );

	#通过采集到的列表页内容，从中匹配文章页链接
	$artLnkOfLst = $picker->getLstPageArtUrl( $theLstPgCtt , $pkRule['list_tag'] , $pkRule['url'] );

	#打印处理数据，检查是否有误
	echo "当前获取列表页的链接为：";
	var_dump( $artLnkOfLst );

	#循环遍历所有采集到的文章链接
	foreach ( $artLnkOfLst as $artLnk ) {
		#先判断是否已经采集过,采集过就跳出循环
		if( $picker->is_picked_by_url( $artLnk ) ){
			continue;
		}

		#获取每篇文章页面的标题和内容,获取二维结果数组,每循环一次立即存储
		$theCtt = $picker->getArtPgInfo( $artLnk , $pkRule['title'] , $pkRule['content'] );

		#判断采集到的标题或描述是不是为空，如果为空则不存储，继续下次循环
		if( 0 == mb_strlen( $theCtt[0] ) || 0 == mb_strlen( $theCtt[1] ) ){
			continue;
		}

		#计算标签，关键词，向量
		$theTags     = $picker->getTags( $theCtt[0] , $theCtt[1] );
		
		/**
		* 文章关键词包含三部分：
		* @param   string   frst   首要关键词
		* @param   array    main   主关键词数组
		* @param   array    othr   其他辅助关键词数组
		* @todo  目前采用计算关键词的有两种方法：
		*		 1、预设关键词库，进行匹配，但是十分关键词量有限，无法兼容所有问题
		*        2、拆分标题，并保存标题中的名词作为关键词
		*        当前测试版本：2
		*/
		$theKeywords = $sd->getKeyWordN( $theCtt[0] , $theCtt[1] ); 
		#直接调用common_word中的函数，来计算文章的向量
		$theVector   = get_savable_vector( $theCtt[0] , $theCtt[1] );

		#合并数据库数组
		$savableArtArr = array( 
			'title'   => $picker->optimArtStr( $theCtt[0] ),
			'summary' => $picker->optimArtStr( $theCtt[1] ),
			'tags'    => $theTags,
			'keyword' => array_serialize( $theKeywords ),
			'url'     => $artLnk,
			'picker'  => $pkId, 
			'vector'  => $theVector,
		);

		#存入数据库
		$relOfSave = save_article( $savableArtArr );

		if( false === $relOfSave ){
			echo ">>>>>>>>文章插入失败<<<<<<<<<<br>";
			continue;
		}

		#关键词与文章映射表也存储完毕之后才算是完全成功
		if( save_kwdAndArtMapping( $theKeywords , $relOfSave ) ){
			echo "<<<<<<<<<文章及关键词映射插入成功>>>>>>>><br>";
		}else{
			echo ">>>>>>>>>>>>文章插入成功，映射插入失败<<<<<<<<<<<<<<<br>";
		}
	}

	#一个列表页采集结束
	echo "采集结束<br><hr><hr>";
	return true;
}

/**
* @name   save_article   保存采集到的文章
* @param  array   artInfo
* @return boolean 插入成功返回当前插入记录的id 
*/
function save_article( $artInfo = array() ){
	global $wpdb;

	#直接进行判断，并返回id
	if( $wpdb->insert( 'wp_article' , $artInfo ) ){
		
		@$id = $wpdb->get_results( "SELECT max(id) AS max FROM wp_article" , ARRAY_A );

		foreach ( $id as $value ) {
			var_dump( $value['max'] );
			return $value['max'];
		}
		
	}else{
		return false;
	}
	
}

/**
* @name   save_kwdAndArtMapping  保存关键词和文章的映射，文章对关键词为1：N的关系
* @param  array   kwds  
* @param  int     pid
* @return boolean 
*/
function save_kwdAndArtMapping( $kwds = array() , $pid = 0 ){
	global $wpdb;

	/**
	* 以下隐藏代码为关键词匹配方法1：关键词库匹配法
	*/
	// foreach ( $kwds['main'] as $kwd ) {
	// 	@$data = array(
	// 		'kwd' => $kwd,
	// 		'pid' => $pid,
	// 		'num' => 1,
	// 	);

	// 	if( $wpdb->insert( 'wp_kp' , $data ) ){
	// 		continue;
	// 	}else{
	// 		return false;
	// 	}
	// }

	/**
	* 名词关键词匹配法
	*/
	foreach ( $kwds as $kwd ) {
		@$data = array(
			'kwd' => $kwd,
			'pid' => $pid,
			'num' => 1,
		);

		if( $wpdb->insert( 'wp_kp' , $data ) ){
			continue;
		}else{
			echo "当前关键词：" . $kwd . "保存失败<br>";
			continue;
		}
	}

	return true;
}

?>

